package ar.com.jsejtman.common.security.schema.entity;

import ar.com.jsejtman.common.domain.entity.Identifiable;
import ar.com.jsejtman.common.domain.entity.IdentifiableComparer;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Version;

/**
 * Permite dar un nuevo permiso, inexistente en el o los grupos de autoridades a los cuales
 * pertenece un usuario, o bien quitar un permiso que tiene asignado de dicho grupo.
 * 
 * @author jsejtman
 */
@Entity
@Table(name = "security_authority_override")
public class AuthorityOverride implements Identifiable<Long> {

	/**
	 * Identificador de la sobreescritura de autoridad.
	 */
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "id")
	private Long id;

	/**
	 * Autoridad que se va a sobreescribir.
	 */
	@ManyToOne
	@JoinColumn(name = "authority_id", nullable = false)
	private Authority authority;

	/**
	 * Indica si la sobreescritura de una autoridad es para habilitar la misma o no. Si el valor de
	 * Enabled es True, sin importar que tenga la autoridad en el grupo se la asigna al usuario. Si
	 * el valor es False, si el usuario ten�a la autoridad en cuestión, es automáticamente
	 * eliminada.
	 */
	@Column(name = "enabled", nullable = false)
	private boolean enabled;

	/**
	 * Usuario de seguridad al cual corresponde la sobreescritura de autoridad.
	 */
	@ManyToOne
	@JoinColumn(name = "security_user_id", nullable = false)
	private SecurityUser securityUser;

	/**
	 * Número de versión de la entidad (para evitar escrituras concurrentes).
	 */
	@Version
	@Column(name = "version", nullable = false)
	private Long version;

	/**
	 * Devuelve el valor de id.
	 * 
	 * @return El valor de id.
	 */
	public final Long getId() {

		return (this.id);
	}

	/**
	 * Asigna un nuevo valor a id.
	 * 
	 * @param id El valor a asignar a id.
	 */
	protected final void setId(final Long id) {

		this.id = id;
	}

	/**
	 * Devuelve el valor de authority.
	 * 
	 * @return El valor de authority.
	 */
	public final Authority getAuthority() {

		return (this.authority);
	}

	/**
	 * Asigna un nuevo valor a authority.
	 * 
	 * @param authority El valor a asignar a authority.
	 */
	public final void setAuthority(final Authority authority) {

		this.authority = authority;
	}

	/**
	 * Devuelve el valor de enabled.
	 * 
	 * @return El valor de enabled.
	 */
	public final boolean isEnabled() {

		return (this.enabled);
	}

	/**
	 * Asigna un nuevo valor a enabled.
	 * 
	 * @param enabled El valor a asignar a enabled.
	 */
	public final void setEnabled(final boolean enabled) {

		this.enabled = enabled;
	}

	/**
	 * Devuelve el valor de securityUser.
	 * 
	 * @return El valor de securityUser.
	 */
	public final SecurityUser getSecurityUser() {

		return (this.securityUser);
	}

	/**
	 * Asigna un nuevo valor a securityUser.
	 * 
	 * @param securityUser El valor a asignar a securityUser.
	 */
	protected final void setSecurityUser(final SecurityUser securityUser) {

		this.securityUser = securityUser;
	}

	/**
	 * Devuelve el valor de version.
	 * 
	 * @return El valor de version.
	 */
	protected final Long getVersion() {

		return (this.version);
	}

	/**
	 * Asigna un nuevo valor a version.
	 * 
	 * @param version El valor a asignar a version.
	 */
	protected final void setVersion(final Long version) {

		this.version = version;
	}

	@Override
	public final int hashCode() {

		return ((this.id == null) ? 0 : this.id.hashCode());
	}

	@SuppressWarnings("unchecked")
	@Override
	public final boolean equals(final Object obj) {

		return (IdentifiableComparer.equals(this, (Identifiable<Serializable>) obj));
	}
}
